home *** CD-ROM | disk | FTP | other *** search
-
-
- /* cDragDrop.cpp
- *
- *
- *
- *
- */
-
- #include "headers.h"
- #include <drag.h>
- #include "CDragDrop.h"
- #include "CSimpleAppSite.h"
- #include "App.h"
-
- pascal OSErr drag_HandleTrack(DragTrackingMessage Message, WindowPtr pWindow,
- void* HandlerRefCon, DragReference DragRef);
- pascal OSErr drag_HandleDrop(WindowPtr pWindow, void* HandlerRefCon, DragReference DragRef);
-
- pascal OSErr drag_SendData(FlavorType Flavor, void *HandlerRefCon, ItemReference Item, DragReference DragRef);
-
-
- /**[r******************************************************************
- * NewDragDrop
- *
- * DESCRIPTION: Constructor and Installs Mac drag handlers
- *
- *
- **r]*******************************************************************/
- CDragDrop* CDragDrop::NewDragDrop(WindowPtr pWindow)
- {
- CDragDrop* pDragDrop = NULL;
-
- pDragDrop = new CDragDrop;
- if ( !pDragDrop )
- return nil;
-
- if ( pDragDrop->Initialize(pWindow) != noErr )
- {
- delete pDragDrop;
- return nil;
- }
-
- return pDragDrop;
- }
-
-
- /**[r******************************************************************
- * Initialize
- *
- *
- *
- **r]*******************************************************************/
- OSErr CDragDrop::Initialize(WindowPtr pWindow)
- {
- OSErr Error = noErr;
- Boolean TrackerInstalled = false;
-
- Window = pWindow;
-
- DragTrackingHandler = NewDragTrackingHandlerProc(drag_HandleTrack);
- DragReceiveHandler = NewDragReceiveHandlerProc(drag_HandleDrop);
-
- if ( (Error = InstallTrackingHandler(DragTrackingHandler, pWindow, (void*) this)) != noErr )
- goto cleanup;
- TrackerInstalled = true;
-
- if ( (Error = InstallReceiveHandler(DragReceiveHandler, pWindow, (void*) this)) != noErr )
- goto cleanup;
-
- return Error;
-
- cleanup:
- if (TrackerInstalled)
- RemoveTrackingHandler(DragTrackingHandler, pWindow);
- if ( DragTrackingHandler )
- DisposeRoutineDescriptor(DragTrackingHandler);
- if ( DragReceiveHandler )
- DisposeRoutineDescriptor(DragReceiveHandler);
-
- return Error;
- }
-
- /**[r******************************************************************
- * CDragDrop
- *
- * DESCRIPTION: Constructor and Installs Mac drag handlers
- *
- *
- **r]*******************************************************************/
- CDragDrop::CDragDrop(void)
- {
- IsOurDrag = FALSE;
- DragOkay = FALSE;
- DragTrackingHandler = NULL;
- DragReceiveHandler = NULL;
- }
-
-
- /**[r******************************************************************
- * DisposeDragDrop
- *
- * DESCRIPTION: Destructor
- *
- **r]*******************************************************************/
- void CDragDrop::DisposeDragDrop(void)
- {
- if ( DragTrackingHandler )
- {
- RemoveTrackingHandler(DragTrackingHandler, Window);
- DisposeRoutineDescriptor(DragTrackingHandler);
- DragTrackingHandler = NULL;
- }
- if ( DragReceiveHandler )
- {
- RemoveReceiveHandler(DragReceiveHandler, Window);
- DisposeRoutineDescriptor(DragReceiveHandler);
- DragReceiveHandler = NULL;
- }
- delete this;
- }
-
- /**[r******************************************************************
- * EnterWindow
- *
- * DESCRIPTION: Handle a begin enter window message
- *
- *
- **r]*******************************************************************/
- void CDragDrop::EnterWindow(DragReference DragRef, WindowPtr pWindow)
- {
- RgnHandle TempRgn;
- GrafPtr SavePort;
- DragAttributes Attributes;
-
- ::GetDragAttributes(DragRef, &Attributes);
-
- DragOkay = ( DragItemsOkay(DragRef) && (Attributes & dragHasLeftSenderWindow) &&
- !IsOurDrag );
-
- if ( DragOkay )
- {
- ::GetPort(&SavePort);
- ::SetPort(pWindow);
-
- TempRgn = ::NewRgn();
- ::RectRgn(TempRgn, &pWindow->portRect);
- ::ShowDragHilite(DragRef, TempRgn, TRUE);
- ::DisposeRgn(TempRgn);
-
- ::SetPort(SavePort);
- }
- }
-
-
- /**[r******************************************************************
- * LeaveWindow
- *
- * DESCRIPTION: Handle a exit window message
- *
- *
- **r]*******************************************************************/
- void CDragDrop::LeaveWindow(DragReference DragRef)
- {
- if ( DragOkay )
- ::HideDragHilite(DragRef);
- DragOkay = FALSE;
- }
-
-
- /**[r******************************************************************
- * Drop
- *
- * DESCRIPTION: Handle a enter window message
- *
- *
- **r]*******************************************************************/
- void CDragDrop::Drop(DragReference DragRef)
- {
- HFSFlavor FSData;
- Size DataSize = sizeof(HFSFlavor);
- ItemReference ItemRef;
- OSErr Result;
-
- Result = GetDragItemReferenceNumber(DragRef, 1, &ItemRef);
-
- if (Result == noErr &&
- ::GetFlavorData(DragRef, ItemRef, flavorTypeHFS, &FSData, &DataSize, 0L) == noErr)
- CreateControlFromFileSpec(&FSData.fileSpec);
- }
-
-
- /**[r******************************************************************
- * DragItemsOkay
- *
- * DESCRIPTION: Returns TRUE if drag items are acceptable
- *
- *
- **r]*******************************************************************/
- Boolean CDragDrop::DragItemsOkay(DragReference DragRef)
- {
- Boolean Okay = FALSE;
- OSErr Result;
- unsigned short NumItems;
- ItemReference ItemRef;
- FlavorFlags Flavor;
-
- Result = ::CountDragItems(DragRef, &NumItems);
- if ( Result == noErr && NumItems == 1 )
- {
- Result = ::GetDragItemReferenceNumber(DragRef, 1, &ItemRef);
- if ( Result == noErr )
- {
- if (::GetFlavorFlags( DragRef, ItemRef, flavorTypeHFS, &Flavor) == noErr)
- {
- HFSFlavor FSData;
- Size DataSize = sizeof(HFSFlavor);
-
- if (::GetFlavorData( DragRef, ItemRef, flavorTypeHFS, &FSData, &DataSize, 0L) == noErr
- && FSData.fileType == 'shlb' && FSData.fileCreator == 'cfmg')
- return true;
- }
- }
- }
-
- return Okay;
- }
-
-
-
- /**[r******************************************************************
- * drag_HandleTrack
- *
- * DESCRIPTION: Mac drag manager callback handler
- *
- *
- **r]*******************************************************************/
- pascal OSErr drag_HandleTrack(DragTrackingMessage Message, WindowPtr pWindow, void* HandlerRefCon, DragReference DragRef)
- {
- CDragDrop* pDragDrop = (CDragDrop*) HandlerRefCon;
-
- switch (Message)
- {
- case dragTrackingEnterHandler:
- break;
-
- case dragTrackingEnterWindow:
- pDragDrop->EnterWindow(DragRef, pWindow);
- break;
-
- case dragTrackingInWindow:
- break;
-
- case dragTrackingLeaveWindow:
- pDragDrop->LeaveWindow(DragRef);
- break;
-
- case dragTrackingLeaveHandler:
- break;
-
- default:
- break;
-
- }
-
- return noErr;
- }
-
- /**[r******************************************************************
- * drag_HandleDrop
- *
- * DESCRIPTION: Handle a drop on a window
- *
- *
- **r]*******************************************************************/
- pascal OSErr drag_HandleDrop(WindowPtr pWindow, void* HandlerRefCon, DragReference DragRef)
- {
- CDragDrop* pDragDrop = (CDragDrop*) HandlerRefCon;
-
- pDragDrop->Drop(DragRef);
- HideDragHilite(DragRef);
- EraseRect(&pWindow->portRect);
- InvalRect(&pWindow->portRect);
-
- return noErr;
- }
-
-
-
-